package com.tjh.gulimall.seckill.scheduled;

import com.tjh.gulimall.seckill.service.SeckillService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * Create by koala on 2021-05-30
 */
@Slf4j
@Service
public class SeckillSkuScheduled {

    @Autowired
    SeckillService seckillService;

    @Autowired
    RedissonClient redissonClient;

    private  final String  upload_lock = "seckill:upload:lock";

    /**
     * day135：秒杀商品的定时上架
     *     每天晚上3点；上架最近三天需要秒杀的商品。
     *     当天00:00:00  - 23:59:59
     *     明天00:00:00  - 23:59:59
     *     后天00:00:00  - 23:59:59
     * 测试：
     *      1、登录后台服务（http://localhost:8001/#/login）
     *      2、进入菜单 优惠营销--》每日秒杀
     *      3、新增秒杀信息及关联商品信息（此时数据库gulimall_sms 中的表sms_seckill_session和表sms_seckill_sku_relation 有了相应的秒杀商品信息数据）
     *      4、定时任务启动，缓存秒杀商品信息数据到redis中
     *      5、redis数据库中便可以看到相应的秒杀商品信息数据（关键字：seckill）
     */
    //TODO 幂等性处理
//    @Scheduled(cron = "*/3 * * * * ?")
    @Scheduled(cron = "0 * * * * ?") //每分钟执行一次吧，上线后调整为每天晚上3点执行
//    @Scheduled(cron = "0 0 3 * * ?") 线上模式
    public void uploadSeckillSkuLatest3Days(){
        //1、重复上架无需处理
        log.info("上架秒杀的商品信息...");
        // 分布式锁。锁的业务执行完成，状态已经更新完成。释放锁以后。其他人获取到就会拿到最新的状态。
        RLock lock = redissonClient.getLock(upload_lock);
        lock.lock(10, TimeUnit.SECONDS);
        try{
            seckillService.uploadSeckillSkuLatest3Days();
        }finally {
            lock.unlock();
        }
    }

}
